﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Xml.Serialization;

namespace PowerTools
{
    public partial class PouvoirsXMLManuelClasse
    {
        public override string ToString()
        {
            Int32 result = default(Int32);
            return nom_classe + " : " + (Int32.TryParse(max_niv, out result) ? "Jusqu'au niveau " + max_niv : max_niv);
        }

        public void VersObjet(string valeur)
        {
            string[] t = null;
            t = valeur.Split(':');
            nom_classe = t[0].Trim();
            max_niv = t[1].Replace("Jusqu'au niveau", "").Trim();
        }
    }

    public partial class PouvoirsXML
    {
        public const string TitreOfficiel = "Pouvoirs Officiels";
        public override int GetHashCode()
        {
            return Titre.GetHashCode() + Créé_le.GetHashCode() + this.Version.GetHashCode() + Capacites().Count();
        }

        [XmlIgnore()]
        public bool Officiel
        {
            get { return Titre == TitreOfficiel; }
        }

        [XmlIgnore()]
        public int NombrePouvoirs
        {
            get { return this.nombrepouvoir[0].valeur; }
            set { this.nombrepouvoir[0].valeur = value; }
        }
        [XmlIgnore()]
        public int NombreTraits
        {
            get { return this.nombretrait[0].valeur; }
            set { this.nombretrait[0].valeur = value; }
        }
        [XmlIgnore()]
        public int NombreAptitudes
        {
            get { return this.nombreaptitude[0].valeur; }
            set { this.nombreaptitude[0].valeur = value; }
        }
        public void ExclureManuel(IEnumerable<string> titres)
        {
            foreach (PouvoirsXMLPouvoir p in pouvoir)
            {
                p.Exclu = titres.Contains(p.livre);
            }
        }

        /// <summary>
        /// Renvoie tout les pouvoirs, quelqu'ils soient
        /// </summary>
        /// <returns></returns>
        public IEnumerable<PouvoirsXMLPouvoir> Capacites()
        {
            return pouvoir;
        }

        public IEnumerable<PouvoirsXMLPouvoir> CapacitesNonSupprimes()
        {
            return pouvoir.Where(t => t.Modifie != enumTypeModification.Supprimé);
        }
        public IEnumerable<PouvoirsXMLPouvoir> Aptitudes()
        {
            return pouvoir.FindAll(t => (t.ident == "A"));
        }

        public IEnumerable<PouvoirsXMLPouvoir> Traits()
        {
            return pouvoir.FindAll(t => (t.ident == "T"));
        }

        public IEnumerable<PouvoirsXMLPouvoir> Pouvoirs()
        {
            return pouvoir.FindAll(t => (t.ident == "P"));
        }
        public IEnumerable<PouvoirsXMLPouvoir> AptitudesNonSupprimes()
        {
            return pouvoir.FindAll(t => (t.ident == "A" & t.Modifie != enumTypeModification.Supprimé));
        }

        public IEnumerable<PouvoirsXMLPouvoir> TraitsNonSupprimes()
        {
            return pouvoir.FindAll(t => (t.ident == "T" & t.Modifie != enumTypeModification.Supprimé));
        }

        public IEnumerable<PouvoirsXMLPouvoir> PouvoirsNonSupprimes()
        {
            return pouvoir.FindAll(t => (t.ident == "P" & t.Modifie != enumTypeModification.Supprimé));
        }

        public bool SauverXML(string cheminfichier)
        {
            this.nombreaptitude[0].valeur = AptitudesNonSupprimes().Count();
            // Aptitudes.Count()
            this.nombrepouvoir[0].valeur = PouvoirsNonSupprimes().Count();
            //Pouvoirs.Count()
            this.nombretrait[0].valeur = TraitsNonSupprimes().Count();
            //Traits.Count()
            pouvoir.RemoveAll(p => p.Modifie == enumTypeModification.Supprimé);
            XmlSerializer x = new XmlSerializer(this.GetType());
            StreamWriter objStream = new StreamWriter(cheminfichier, false, System.Text.Encoding.UTF8);
            x.Serialize(objStream, this);
            objStream.Close();
            return true;
        }

        public void SupprimerCapacite(PouvoirsXMLPouvoir capacite)
        {
            Debug.Assert(object.ReferenceEquals(capacite.Fichier, this));
            capacite.Modifie = enumTypeModification.Supprimé;
        }

    }


    public partial class PouvoirsXMLPouvoir
    {
        /// <summary>
        /// Pour les cartes
        /// </summary>
        public string MotsClesComposes
        {
            get { string temp = String.Join(", ", motscles[0].motcle.Select(y => y.donnee).ToArray());
                return this.frequence + " * " + temp;
                       
            }
        }
        /// <summary>
        /// Pour l'edition
        /// </summary>
        public string MotsClesComposesAEditer
        {
            get
            {
                string temp = String.Join(", ", motscles[0].motcle.Select(y => y.donnee).ToArray());
                return  temp;

            }
        }
        public override int GetHashCode()
        {
            return nom.GetHashCode();
        }
        public PouvoirsXMLPouvoirTextescasesCasep TexteCase(int index)
        {
            var t = default(PouvoirsXMLPouvoirTextescasesCasep);
            if (textescases.Count == 0)
                textescases.Add(new PouvoirsXMLPouvoirTextescases());
            t = this.textescases[0].casep.SingleOrDefault(x => x.rang == index.ToString());
            if (t == null)
            {
                t = new PouvoirsXMLPouvoirTextescasesCasep();
                t.rang = index.ToString();
                textescases[0].casep.Add(t);
            }
            return t;
        }


        [XmlIgnore()]
        public PowerTools.enumTypeModification Modifie;
        [XmlIgnore()]
        public string TabTexte1
        {
            get { return TabTexte(1).tab; }
            set { TabTexte(1).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte2
        {
            get { return TabTexte(2).tab; }
            set { TabTexte(2).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte3
        {
            get { return TabTexte(3).tab; }
            set { TabTexte(3).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte4
        {
            get { return TabTexte(4).tab; }
            set { TabTexte(4).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte5
        {
            get { return TabTexte(5).tab; }
            set { TabTexte(5).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte6
        {
            get { return TabTexte(6).tab; }
            set { TabTexte(6).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte7
        {
            get { return TabTexte(7).tab; }
            set { TabTexte(7).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte8
        {
            get { return TabTexte(8).tab; }
            set { TabTexte(8).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte9
        {
            get { return TabTexte(9).tab; }
            set { TabTexte(9).tab = value; }
        }
        [XmlIgnore()]
        public string TabTexte10
        {
            get { return TabTexte(10).tab; }
            set { TabTexte(10).tab = value; }
        }
        public PouvoirsXMLPouvoirTextesT TabTexte(int index)
        {
            PouvoirsXMLPouvoirTextesT t = default(PouvoirsXMLPouvoirTextesT);
            if (textes.Count == 0)
                textes.Add(new PouvoirsXMLPouvoirTextes());
            t = this.textes[0].T.SingleOrDefault(x => x.rang == index.ToString());
            if (t == null)
            {
                t = new PouvoirsXMLPouvoirTextesT();
                t.rang = index.ToString();
                this.textes[0].T.Add(t);
            }
            return t;
        }

        [XmlIgnore()]

        public PouvoirsXML Fichier;
        [XmlIgnore()]
        private bool _exclu;
        [XmlIgnore()]
        public bool Exclu
        {
            get { return _exclu; }
            set { _exclu = value; }
        }
        [XmlIgnore()]
        public enumTypePouvoir TypeCapacite
        {
            get
            {
                switch (ident)
                {
                    case "P":
                        return enumTypePouvoir.Pouvoir;
                    case "T":
                        return enumTypePouvoir.Trait;
                    case "A":
                        return enumTypePouvoir.Aptitude;
                    default:
                        throw new ArgumentException("XML : Ident inconnu:" + ident);
                }

            }
        }

        [XmlIgnore()]
        public string Texte1
        {
            get { return TabTexte(1).donnee; }
            set { TabTexte(1).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte2
        {
            get { return TabTexte(2).donnee; }
            set { TabTexte(2).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte3
        {
            get { return TabTexte(3).donnee; }
            set { TabTexte(3).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte4
        {
            get { return TabTexte(4).donnee; }
            set { TabTexte(4).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte5
        {
            get { return TabTexte(5).donnee; }
            set { TabTexte(5).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte6
        {
            get { return TabTexte(6).donnee; }
            set { TabTexte(6).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte7
        {
            get { return TabTexte(7).donnee; }
            set { TabTexte(7).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte8
        {
            get { return TabTexte(8).donnee; }
            set { TabTexte(8).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte9
        {
            get { return TabTexte(9).donnee; }
            set { TabTexte(9).donnee = value; }
        }
        [XmlIgnore()]
        public string Texte10
        {
            get { return TabTexte(10).donnee; }
            set { TabTexte(10).donnee = value; }
        }
        [XmlIgnore()]
        public string typeTexte1
        {
            get { return TabTexte(1).type; }
            set { TabTexte(1).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte2
        {
            get { return TabTexte(2).type; }
            set { TabTexte(2).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte3
        {
            get { return TabTexte(3).type; }
            set { TabTexte(3).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte4
        {
            get { return TabTexte(4).type; }
            set { TabTexte(4).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte5
        {
            get { return TabTexte(5).type; }
            set { TabTexte(5).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte6
        {
            get { return TabTexte(6).type; }
            set { TabTexte(6).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte7
        {
            get { return TabTexte(7).type; }
            set { TabTexte(7).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte8
        {
            get { return TabTexte(8).type; }
            set { TabTexte(8).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte9
        {
            get { return TabTexte(9).type; }
            set { TabTexte(9).type = value; }
        }
        [XmlIgnore()]
        public string typeTexte10
        {
            get { return TabTexte(10).type; }
            set { TabTexte(10).type = value; }
        }
        [XmlIgnore()]
        public string textecase1
        {
            get { return TexteCase(1).donnee; }
            set { TexteCase(1).donnee = value; }
        }
        [XmlIgnore()]
        public string textecase2
        {
            get { return TexteCase(2).donnee; }
            set { TexteCase(2).donnee = value; }
        }
        [XmlIgnore()]
        public string textecase3
        {
            get { return TexteCase(3).donnee; }
            set { TexteCase(3).donnee = value; }
        }
        [XmlIgnore()]
        public string textecase4
        {
            get { return TexteCase(4).donnee; }
            set { TexteCase(4).donnee = value; }
        }
        [XmlIgnore()]
        public string textecase5
        {
            get { return TexteCase(5).donnee; }
            set { TexteCase(5).donnee = value; }
        }
        // ''' <summary>
        // ''' Convertit un ancien pouvoir perso.
        // ''' </summary>
        // ''' <param name="oldPouv">Ancien pouvoir perso.</param>
        //Public Sub New(ByVal oldPouv As PouvPersoPouvoir)

        //    With oldPouv

        //        nom = .nom
        //        nomorigine = .nomorigine
        //        type = .type
        //        niveau = .niveau
        //        textetype = .textetype
        //        origine = .origine
        //        description = .description
        //        frequence = .frequence
        //        motscles = .motscles
        //        typeaction = .typeaction
        //        typeattaque = .typeattaque
        //        portee = .portee
        //        'tabtexte1 = If(.tabtexte1 = "", "0", .tabtexte1)
        //        'typetexte1 = .typetexte1
        //        'texte1 = .texte1
        //        'tabtexte2 = If(.tabtexte2 = "", "0", .tabtexte2)
        //        'typetexte2 = .typetexte2
        //        'texte2 = .texte2
        //        'tabtexte3 = If(.tabtexte3 = "", "0", .tabtexte3)
        //        'typetexte3 = .typetexte3
        //        'texte3 = .texte3
        //        'tabtexte4 = If(.tabtexte4 = "", "0", .tabtexte4)
        //        'typetexte4 = .typetexte4
        //        'texte4 = .texte4
        //        'tabtexte5 = If(.tabtexte5 = "", "0", .tabtexte5)
        //        'typetexte5 = .typetexte5
        //        'texte5 = .texte5
        //        'tabtexte6 = If(.tabtexte6 = "", "0", .tabtexte6)
        //        'typetexte6 = .typetexte6
        //        'texte6 = .texte6
        //        'tabtexte7 = If(.tabtexte7 = "", "0", .tabtexte7)
        //        'typetexte7 = .typetexte7
        //        'texte7 = .texte7
        //        'tabtexte8 = If(.tabtexte8 = "", "0", .tabtexte8)
        //        'typetexte8 = .typetexte8
        //        'texte8 = .texte8
        //        'tabtexte9 = If(.tabtexte9 = "", "0", .tabtexte9)
        //        'typetexte9 = .typetexte9
        //        'texte9 = .texte9
        //        'tabtexte10 = If(.tabtexte10 = "", "0", .tabtexte10)
        //        'typetexte10 = .typetexte10
        //        'texte10 = .texte10
        //        'Ajout des textes des cases
        //        'textecase1 = .textecase1
        //        'textecase2 = .textecase2
        //        'textecase3 = .textecase3
        //        'textecase4 = .textecase4
        //        'textecase5 = .textecase5
        //        livre = .livre
        //        page = .page
        //    End With
        //End Sub
    }

}
